/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo.persistencia;

import modelo.regresion.RegresionLineal;
import java.util.ArrayList;
import java.util.List;
import modelo.Tablespace;
import org.jespxml.JespXML;
import org.jespxml.modelo.Tag;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import modelo.DiaTablespace;
import modelo.Tabla;
import modelo.respaldo.Respaldo;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

/**
 *
 * @author Carlos
 */
public class XML {

    List<Tablespace> list;
    List<Tablespace> list2;
    List<Tablespace> list3;

    public XML() {
        list = new ArrayList<>();
        list2 = new ArrayList<>();
        list3 = new ArrayList<>();
    }

    public void escribeCambios(List<Tablespace> l1) {
        list3 = LeerXML(null);

        for (Tablespace tt : l1) {
            agregaRango(tt.getNombre(), tt.getRango());
        }

        Escribir_XML(list3);
    }

    public boolean agregaRango(String nombre, int rango) {
        for (Tablespace tb : list3) {
            if (tb.getNombre().equals(nombre)) {
                tb.setRango(rango);
                return true;
            }
        }
        return false;
    }

    public void Escribir_XML(List<Tablespace> tablespaces) {

        try {
            JespXML archivo = new JespXML("libro.xml");
            Tag monitor = new Tag("Monitor");

            int i, j, k;
            Tag tag_tablespace, nombre, fec, tablas, fec2, pctj_libre, rango, usado, libre;
            for (i = 0; i < tablespaces.size(); i++) {
                tag_tablespace = new Tag("tablespace");

                nombre = new Tag("nombre");
                nombre.addContenido(tablespaces.get(i).getNombre());
                rango = new Tag("rango");
                rango.addContenido(Integer.toString(tablespaces.get(i).getRango()));

                tag_tablespace.addTagHijo(nombre);
                tag_tablespace.addTagHijo(rango);

                for (j = 0; j < tablespaces.get(i).getListaDiaTablespace().size(); j++) {

                    fec = new Tag("fecha");
                    fec2 = new Tag("date");
                    fec2.addContenido(tablespaces.get(i).getListaDiaTablespace().get(j).getFecha());
                    fec.addTagHijo(fec2);
                    pctj_libre = new Tag("PorcentajeLibre");
                    pctj_libre.addContenido(Float.toString(tablespaces.get(i).getListaDiaTablespace().get(j).getPctj_libre()));

                    usado = new Tag("usado");
                    usado.addContenido(Integer.toString(tablespaces.get(i).getListaDiaTablespace().get(j).getUsado()));
                    libre = new Tag("libre");
                    libre.addContenido(Integer.toString(tablespaces.get(i).getListaDiaTablespace().get(j).getLibre()));

                    fec.addTagHijo(pctj_libre);
                    fec.addTagHijo(usado);
                    fec.addTagHijo(libre);

                    for (k = 0; k < tablespaces.get(i).getListaDiaTablespace().get(j).get_tablas().size(); k++) {

                        tablas = new Tag("tabla");
                        Tag Nombre_Tabla, Cant_Individuos_Tabla, Tamaño_total_Tabla, Nuevos_Individuos;
                        Nombre_Tabla = new Tag("Nombre_Tabla");
                        Cant_Individuos_Tabla = new Tag("Cant_Individuos_Tabla");
                        Tamaño_total_Tabla = new Tag("Tamaño_total_Tabla");
                        Nuevos_Individuos = new Tag("Nuevos_Individuos");
                        Nombre_Tabla.addContenido(tablespaces.get(i).getListaDiaTablespace().get(j).get_tablas().get(k).getNombre());
                        Cant_Individuos_Tabla.addContenido(tablespaces.get(i).getListaDiaTablespace().get(j).get_tablas().get(k).getFilas().toString());
                        Tamaño_total_Tabla.addContenido(tablespaces.get(i).getListaDiaTablespace().get(j).get_tablas().get(k).getTamano().toString());
                        if (k == 0) {
                            Integer a = 0;
                            Nuevos_Individuos.addContenido(a.toString());
                        } else {
                            Integer act = tablespaces.get(i).getListaDiaTablespace().get(j).get_tablas().get(k).getFilas();
                            Integer ant = 0;
                            if (j > 1) {
                                ant = tablespaces.get(i).getListaDiaTablespace().get(j - 1).get_tablas().get(k).getFilas();
                            }
                            Integer res = act - ant;
                            Nuevos_Individuos.addContenido(res.toString());
                        }

                        tablas.addTagHijo(Nombre_Tabla);
                        tablas.addTagHijo(Cant_Individuos_Tabla);
                        tablas.addTagHijo(Tamaño_total_Tabla);
                        tablas.addTagHijo(Nuevos_Individuos);
                        fec.addTagHijo(tablas);
                    }
                    tag_tablespace.addTagHijo(fec);
                }

                monitor.addTagHijo(tag_tablespace);
            }

            archivo.escribirXML(monitor);
        } catch (Exception ex) {
            ex.printStackTrace();
            ex.getCause();
        }
    }
    Tabla t1;
    DiaTablespace d1;
    Tablespace ts1;

    public List<Tablespace> LeerXML(RegresionLineal regresionLineal) {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(new File("libro.xml"));
            doc.getDocumentElement().normalize();
            String a = "", b = "", c = "", d = "";
            NodeList lista_tablespaces = doc.getElementsByTagName("tablespace");
            for (int i = 0; i < lista_tablespaces.getLength(); i++) {
                Node tbs = lista_tablespaces.item(i);
                if (tbs.getNodeType() == Node.ELEMENT_NODE) {

                    Element elemento = (Element) tbs;

                    String tb11 = getTagValue("nombre", elemento);
                    String rang11 = getTagValue("rango", elemento);
                    ts1 = new Tablespace(tb11);
                    ts1.setRango(Integer.parseInt(rang11));

                    NodeList list_fechas = elemento.getElementsByTagName("fecha");

                    for (int k = 0; k < list_fechas.getLength(); k++) {
                        Node fechaI = list_fechas.item(k);
                        Element dat = (Element) fechaI;
                        d1 = new DiaTablespace(getTagValue("date", dat));
                        String PorcentajeLibre = getTagValue("PorcentajeLibre", dat);
                        String usado1 = getTagValue("usado", dat);
                        String libre1 = getTagValue("libre", dat);
                        d1.setPctj_libre(Float.parseFloat(PorcentajeLibre));
                        d1.setUsado(Integer.parseInt(usado1));
                        d1.setLibre(Integer.parseInt(libre1));
                        NodeList list_tablas = elemento.getElementsByTagName("tabla");

                        for (int j = 0; j < list_tablas.getLength(); j++) {

                            Node tbs2 = list_tablas.item(j);

                            if (tbs2.getNodeType() == Node.ELEMENT_NODE) {
                                Element elemento2 = (Element) tbs2;
                                a = getTagValue("Nombre_Tabla", elemento2);
                                b = getTagValue("Cant_Individuos_Tabla", elemento2);
                                c = getTagValue("Tamaño_total_Tabla", elemento2);
                                d = getTagValue("Nuevos_Individuos", elemento2);
                                t1 = new Tabla(a, Integer.parseInt(b), Float.parseFloat(c), Integer.parseInt(d));
                            }
                            if (regresionLineal != null) {
                                regresionLineal.agrega(tb11, a, Float.parseFloat(c), Integer.parseInt(b));
                            }
                            d1.agregarTabla(t1);
                        }
                        if (regresionLineal != null) {
                            regresionLineal.setEspacios(tb11, Float.parseFloat(usado1), Float.parseFloat(libre1));
                        }
                        ts1.agregarDia(d1);
                    }
                }
                list2.add(ts1);
            }
            return list2;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String getTagValue(String sTag, Element eElement) {
        NodeList nlList = null;
        try {
            nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

        } catch (Exception ex) {
            return "NO";
        }

        Node nValue = (Node) nlList.item(0);
        return nValue.getNodeValue();
    }

    public void Escribir_XML_Consulta(List<String> consulta) {
        Date date = new Date();
        DateFormat hourdateFormat = new SimpleDateFormat("HH.mm.ss dd-MM-yyyy");
        String fechaEvento = hourdateFormat.format(date);

        try {
            JespXML archivo = new JespXML(fechaEvento+".xml");
            Tag raizConsulta = new Tag("Reporte");

            int i;
            Tag consult_tag;
            for (i = 0; i < consulta.size(); i++) {
                consult_tag = new Tag("consulta");

                consult_tag.addContenido(consulta.get(i).toString());

                raizConsulta.addTagHijo(consult_tag);
            }

            archivo.escribirXML(raizConsulta);
        } catch (Exception ex) {
            ex.printStackTrace();
            ex.getCause();
        }
    }

    public void Escribir_XML_Respaldo(List<Respaldo> respaldo) {

        try {
            JespXML archivo = new JespXML("xmlRespaldo.xml");
            Tag raizRespaldo = new Tag("xmlRespaldo");

            int i;
            Tag respaldo_tag, tipo, regularidad, qtables, fecha, tablespac;
            for (i = 0; i < respaldo.size(); i++) {
                respaldo_tag = new Tag("respaldo");

                tipo = new Tag("tipo");
                tipo.addContenido(Integer.toString(respaldo.get(i).getTipo()));
                regularidad = new Tag("regularidad");
                regularidad.addContenido(Integer.toString(respaldo.get(i).getRegularidad()));
                qtables = new Tag("cantidadTS");
                qtables.addContenido(Integer.toString(respaldo.get(i).getqTables()));
                fecha = new Tag("fecha");
                fecha.addContenido(respaldo.get(i).getFecha());
                respaldo_tag.addTagHijo(tipo);
                respaldo_tag.addTagHijo(regularidad);
                respaldo_tag.addTagHijo(qtables);
                respaldo_tag.addTagHijo(fecha);

                tablespac = new Tag("tablespaces");

                for (int j = 0; j < respaldo.get(i).getTablespaces().size(); j++) {
                    Tag nombre_TS;
                    nombre_TS = new Tag("nombre");
                    nombre_TS.addContenido(respaldo.get(i).getTablespaces().get(j).getNombre());

                    tablespac.addTagHijo(nombre_TS);
                }

                respaldo_tag.addTagHijo(tablespac);

                raizRespaldo.addTagHijo(respaldo_tag);
            }

            archivo.escribirXML(raizRespaldo);
        } catch (Exception ex) {
            ex.printStackTrace();
            ex.getCause();
        }
    }
    Respaldo rs1;

    public List<Respaldo> LeerXML_Respaldos() {
        ArrayList<Tablespace> ts2 = new ArrayList<>();

        List<Respaldo> listResp = new ArrayList<>();

        try {

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(new File("xmlRespaldo.xml"));
            doc.getDocumentElement().normalize();
            NodeList lista_respaldos = doc.getElementsByTagName("respaldo");

            for (int i = 0; i < lista_respaldos.getLength(); i++) {
                ts2 = new ArrayList<>();
                Node tbs = lista_respaldos.item(i);
                if (tbs.getNodeType() == Node.ELEMENT_NODE) {

                    Element elemento = (Element) tbs;

                    String tb1 = getTagValue("tipo", elemento);
                    String tb2 = getTagValue("regularidad", elemento);
                    String tb3 = getTagValue("cantidadTS", elemento);
                    String tb4 = getTagValue("fecha", elemento);

                    NodeList list_tsp = elemento.getElementsByTagName("tablespaces");

                    for (int k = 0; k < list_tsp.getLength(); k++) {
                        Node names_N = list_tsp.item(k);
                        Element dat = (Element) names_N;

                        NodeList sdsd = dat.getElementsByTagName("nombre");
                        for (int j = 0; j < sdsd.getLength(); j++) {

                            ts2.add(new Tablespace(sdsd.item(j).getTextContent()));
                        }
                    }
                    rs1 = new Respaldo(Integer.parseInt(tb1), Integer.parseInt(tb2), Integer.parseInt(tb3), ts2, tb4);
                    listResp.add(rs1);
                }
            }
            return listResp;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
